<?php
//
//  FPDI - Version 1.3.1
//
//    Copyright 2004-2009 Setasign - Jan Slabon
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

if (!defined('ORD_z'))
define('ORD_z',ord('z'));
if (!defined('ORD_exclmark'))
define('ORD_exclmark', ord('!'));
if (!defined('ORD_u'))
define('ORD_u', ord('u'));
if (!defined('ORD_tilde'))
define('ORD_tilde', ord('~'));

class FilterASCII85 {

	function error($msg) {
		die($msg);
	}

	function decode($in) {
		$out = '';
		$state = 0;
		$chn = null;

		$l = strlen($in);

		for ($k = 0; $k < $l; ++$k) {
			$ch = ord($in[$k]) & 0xff;

			if ($ch == ORD_tilde) {
				break;
			}
			if (preg_match('/^\s$/',chr($ch))) {
				continue;
			}
			if ($ch == ORD_z && $state == 0) {
				$out .= chr(0).chr(0).chr(0).chr(0);
				continue;
			}
			if ($ch < ORD_exclmark || $ch > ORD_u) {
				$this->error('Illegal character in ASCII85Decode.');
			}

			$chn[$state++] = $ch - ORD_exclmark;

			if ($state == 5) {
				$state = 0;
				$r = 0;
				for ($j = 0; $j < 5; ++$j)
				$r = $r * 85 + $chn[$j];
				$out .= chr($r >> 24);
				$out .= chr($r >> 16);
				$out .= chr($r >> 8);
				$out .= chr($r);
			}
		}
		$r = 0;

		if ($state == 1)
		$this->error('Illegal length in ASCII85Decode.');
		if ($state == 2) {
			$r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85;
			$out .= chr($r >> 24);
		}
		else if ($state == 3) {
			$r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + ($chn[2]+1) * 85 * 85;
			$out .= chr($r >> 24);
			$out .= chr($r >> 16);
		}
		else if ($state == 4) {
			$r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + $chn[2] * 85 * 85  + ($chn[3]+1) * 85 ;
			$out .= chr($r >> 24);
			$out .= chr($r >> 16);
			$out .= chr($r >> 8);
		}

		return $out;
	}

	function encode($in) {
		$this->error("ASCII85 encoding not implemented.");
	}
}